package ads.pin.pinmon.dal;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

import ads.pin.pinmon.entity.Skill;

/**
 * Classe de acesso a dados para a Skill.
 * 
 * Deve ser utilizada apenas para a comunicacao com o database, contendo metodos
 * relacionados ao mesmo: Save(insert), Update, Select, Delete.
 * 
 * Save Query: insert into skill(name, kind, damage, author) values (?, ?, ?, ?)
 * 
 * @author lanedraex
 * 
 */
public class SkillDAO {

	private EntityManager em = new EntityManager() {

		@Override
		public Object treatResultSet(ResultSet resultSet) throws SQLException {
			Skill skill = new Skill();
			skill.setId(resultSet.getInt("id"));
			skill.setName(resultSet.getString("name"));
			skill.setKind(resultSet.getString("kind"));
			skill.setDamage(resultSet.getInt("damage"));
			skill.setAuthor(resultSet.getString("author"));
			return skill;
		}
	};

	/**
	 * Insere uma skill no banco de dados.
	 * 
	 * @param skill
	 *            Skill a ser inserida.
	 * @throws SQLException
	 */
	public void save(Skill skill) throws SQLException {
		String sql = "insert into skill (name, kind, damage, "
				+ "author) values (?, ?, ?, ?)";

		em.executeQuery(sql, skill.getName(), skill.getKind(),
				skill.getDamage(), skill.getAuthor());

	}

	/**
	 * Atualiza a skill no banco de dados.
	 * 
	 * @param skill
	 *            Skill a ser atualizada.
	 * @throws SQLException
	 */
	public void update(Skill skill) throws SQLException {
		String sql = "update skill set name = ?, "
				+ "kind = ?, damage = ?, author = ? where id = ?";

		em.executeQuery(sql, skill.getName(), skill.getKind(),
				skill.getDamage(), skill.getAuthor(), skill.getId());

	}

	/**
	 * Deleta uma skill especifica
	 * 
	 * @param id
	 *            Id da skill a ser deletada.
	 * @throws SQLException
	 */
	public void deleteById(Integer id) throws SQLException {
		String sql = "delete from skill where id = ?";
		em.executeQuery(sql, id);

	}

	/**
	 * Deleta todas as skills da tabela.
	 * 
	 * @throws SQLException
	 */
	public void deleteAll() throws SQLException {
		String sql = "delete from skill";
		em.executeQuery(sql);

	}

	/**
	 * Retorna uma skill especifica.
	 * 
	 * @param id
	 *            Id da skill selecionada.
	 * @return Skill escolhida.
	 * @throws SQLException
	 */
	public Skill searchById(Integer id) throws SQLException {
		String sql = "select id, name, kind, damage, author from skill where id = ?";
		return (Skill) em.getSingleResult(sql, id);

	}

	/**
	 * Procura e retorna todas as skills do tipo escolhido.
	 * 
	 * @param kind
	 *            Tipo da skills desejada.
	 * @return Lista com as skills do tipo escolhido.
	 * @throws SQLException
	 */
	@SuppressWarnings("unchecked")
	public List<Skill> searchByKind(Object kind) throws SQLException {
		String sql = " select id, name, kind, damage, author from skill where kind = ? ";
		return (List<Skill>) em.getResultList(sql, kind);
	}

	/**
	 * Seleciona todas as skills e as coloca em uma lista.
	 * 
	 * @return Lista com as skills.
	 * @throws SQLException
	 */
	@SuppressWarnings("unchecked")
	public List<Skill> searchAll() throws SQLException {
		String sql = "select id, name, kind, damage, author from skill";
		return (List<Skill>) em.getResultList(sql);
	}
}
